﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Entidades = PSE.Tools.CadastroMensagens.Entidades;
using Negocio = PSE.Tools.CadastroMensagens.Negocio;
using Apresentacao = PSE.Tools.CadastroMensagens.Apresentacao;
using PSE.Tools.Util.Entidades;
namespace Web.Paginas
{
    public partial class Mensagens  : Base.PaginaBase, Apresentacao.IApresentacao
    {
        #region [ Variaveis ]
        private Apresentacao.Mensagens _apresentacao;
        #endregion [ Variaveis ]

        #region [ Construtores ]
        public Mensagens()
        {
            _apresentacao = new Apresentacao.Mensagens(this, new Negocio.Mensagens());
        }
        #endregion [ Construtores ]

        #region [ Eventos ]
        protected override void OnLoad(EventArgs e)
        {
            lnkNovo.Click += new EventHandler(lnkNovo_Click);
            lnkCancelar.Click += new EventHandler(lnkCancelar_Click);

            btnInserir.Click += new ImageClickEventHandler(btnInserir_Click);

            grid.ItemCommand += new RepeaterCommandEventHandler(grid_ItemCommand);
            if (!IsPostBack)
            {
                IniciaIdiomas();
                IniciaGrid();
            }
        }

        protected void grid_ItemCommand(object source, RepeaterCommandEventArgs e)
        {
            var parametro = e.CommandArgument.ToString().Split('$');
            int id = 0;
            int.TryParse(parametro[0], out id);
            string sigla = parametro[1];
            if (e.CommandName.Equals("Editar"))
            {
                Carregar(id, sigla);
            }
            if (e.CommandName.Equals("Excluir"))
            {
                Excluir(id, sigla);
            }
            if (e.CommandName.Equals("Adicionar"))
            {
                AdicionarTraducao(id, sigla);
            }
        }

        protected void btnInserir_Click(object sender, ImageClickEventArgs e)
        {
            Salvar();
        }

        protected void lnkNovo_Click(object sender, EventArgs e)
        {
            Novo();
        }

        protected void lnkCancelar_Click(object sender, EventArgs e)
        {
            Cancelar();
        }
        #endregion [ Eventos ]

        #region [ Metodos ]

        protected bool PodeAdicionarTraducoes(object idItem, object siglaItem)
        {
            int id = (int)idItem;
            string sigla = (string)siglaItem;
            return _apresentacao.PodeAdicionarTraducoes(id, sigla);
        }

        private void AdicionarTraducao(int id, string sigla)
        {
            Novo();
            var mensagens = _apresentacao.ObterPorId(id);
            string siglaDefault = _apresentacao.ObtemIdiomaDefault(id).Sigla;
            var mensagem = mensagens.FirstOrDefault(m => m.Idioma.Sigla.Equals(siglaDefault, StringComparison.InvariantCultureIgnoreCase));

            txtId.Value = mensagem.Id.ToString();
            lblTraducao.Text = mensagem.TextoMensagem;
            txtSigla.Value = mensagem.Idioma.Sigla.ToString();

            var idiomas = _apresentacao.ListaIdiomasSemTraducao(id);
            ddlIdioma.DataBind(idiomas, "Descricao", "Sigla");

            var idiomaDefault = _apresentacao.ObtemIdiomaDefault(id);
            MontaScriptGoogleTranslator(mensagem, idiomaDefault.Sigla);
        }

        private void MontaScriptGoogleTranslator(Entidades.Mensagem mensagem, string siglaDefault)
        {
            hlkSugestaoGoogle.Attributes.Add("onclick", "ObterSugestao('" + mensagem.TextoMensagem + "', '" + siglaDefault + "', '" + txtTextoMensagem.ClientID + "', '" + ddlIdioma.ClientID + "')");
            hlkSugestaoGoogle.Visible = true;
        }

        private void IniciaIdiomas()
        {
            var idiomas = _apresentacao.ListaIdiomas();
            ddlIdioma.DataBind(idiomas, "Descricao", "Sigla");
        }

        private void Salvar()
        {
            bool retorno = false;
            Negocio.Idiomas negocioIdiomas = new Negocio.Idiomas();
            Entidades.Idioma idioma = negocioIdiomas.ObterPorSigla(ddlIdioma.SelectedValue);

            Entidades.Mensagem mensagem = new Entidades.Mensagem();
            int id = 0;
            int.TryParse(txtId.Value, out id);
            mensagem.Id = id;
            mensagem.Idioma = idioma;
            mensagem.TextoMensagem = txtTextoMensagem.Text;
            mensagem.Proposito = txtProposito.Text;
            mensagem.Validada = chkValidado.Checked;

            if ( (string.IsNullOrEmpty(txtId.Value)) || 
                 (!string.IsNullOrEmpty(txtId.Value) && !txtSigla.Value.Equals(mensagem.Idioma.Sigla, StringComparison.InvariantCultureIgnoreCase)))
                retorno = _apresentacao.Inserir(mensagem);
            else
                retorno = _apresentacao.Atualizar(mensagem);

            if (retorno)
                IniciaGrid();

            form.Visible = !retorno;
        }

        private void Excluir(int id, string sigla)
        {
            bool retorno = false;
            var mensagem = _apresentacao.ObterPorIdEIdioma(id, sigla);
            retorno = _apresentacao.Excluir(mensagem);
            if(retorno)
                IniciaGrid();
        }

        private void Carregar(int id, string sigla)
        {
            Novo();
            var mensagem = _apresentacao.ObterPorIdEIdioma(id, sigla);
            var idioma = ddlIdioma.Items.FindByValue(sigla);
            if (idioma != null)
                idioma.Selected = true;

            txtId.Value = mensagem.Id.ToString();
            txtSigla.Value = mensagem.Idioma.Sigla.ToString();
            txtTextoMensagem.Text = mensagem.TextoMensagem;
            txtProposito.Text = mensagem.Proposito;
            chkValidado.Checked = mensagem.Validada;
        }

        private void IniciaGrid()
        {
            var itens = _apresentacao.Lista(m => true);
            grid.DataSource = from m in itens
                              select new
                              {
                                  Id = m.Id,
                                  Proposito = m.Proposito,
                                  TextoMensagem = m.TextoMensagem,
                                  Idioma = m.Idioma.Descricao,
                                  Sigla = m.Idioma.Sigla
                              };
            grid.DataBind();
            lblQtdItens.Text = itens.Count.ToString();
        }

        private void Cancelar()
        {
            LimparCampos();
            form.Visible = false;
            lblMensagem.Text = "";
        }

        private void Novo()
        {
            LimparCampos();
            form.Visible = true;
            txtId.Value = string.Empty;
            txtSigla.Value = string.Empty;
            lblIdioma.Text = string.Empty;
            lblTextoMensagem.Text = string.Empty;
            lblProposito.Text = string.Empty;
            lblMensagem.Text = string.Empty;
            IniciaIdiomas();
        }

        private void LimparCampos()
        {
            ddlIdioma.ClearSelection();
            foreach (ListItem item in ddlIdioma.Items)
                item.Enabled = true;

            lblTraducao.Text = string.Empty;
            txtTextoMensagem.Text = string.Empty;
            txtProposito.Text = string.Empty;
            hlkSugestaoGoogle.Visible = false;
            chkValidado.Checked = false;
        }

        public void EnviarMensagem(string mensagem)
        {
            lblMensagem.Text = mensagem;
            lblMensagem.CssClass = "fraseDestaque sucesso";
        }

        public void EnviarMensagemErro(string mensagem)
        {
            lblMensagem.Text = mensagem;
            lblMensagem.CssClass = "fraseDestaque erro";
        }

        public void EnviarMensagemValidacao(IEnumerable<ValidacaoEntidade> validacoes)
        {
            foreach (var validacao in validacoes)
                EnviarMensagemValidacao(validacao);
        }

        public void EnviarMensagemValidacao(ValidacaoEntidade validacao)
        {
            if (validacao.NomePropriedade == "Idioma")
            {
                lblIdioma.CssClass = "atencao";
                lblIdioma.Text = validacao.Mensagem;
            }

            if (validacao.NomePropriedade == "TextoMensagem")
            {
                lblTextoMensagem.CssClass = "atencao";
                lblTextoMensagem.Text = validacao.Mensagem;
            }

            if (validacao.NomePropriedade == "Proposito")
            {
                lblProposito.CssClass = "atencao";
                lblProposito.Text = validacao.Mensagem;
            }
            lblMensagem.CssClass = "fraseDestaque atencao";
            lblMensagem.Text = "Verifique os campos abaixo...";
        }
        #endregion [ Métodos ]
    }
}